/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import org.cip.esymons.colegiatura.bc.ColegiadoFacadeLocal;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.bc.PersonaJuridicaFacadeLocal;
import org.cip.esymons.general.bc.PersonaNaturalFacadeLocal;
import org.cip.esymons.general.bc.SolicitanteFacadeLocal;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.be.CajaChica;
import org.cip.esymons.tesoreria.be.ComprobanteEgreso;
import org.cip.esymons.tesoreria.be.DetCajaChica;
import org.cip.esymons.tesoreria.be.EnumEstadoCajaChica;
import org.cip.esymons.tesoreria.be.EnumEstadoDetCajaChica;
import org.cip.esymons.tesoreria.be.EnumTipoCajaChica;

/**
 *
 * @author Gilmar
 */
@Stateful(name = "RealizarGeneracionCajachicaBean")
@TransactionManagement(TransactionManagementType.BEAN)
public class RealizarGeneracionCajachicaBean implements RealizarGeneracionCajachicaLocal {

    @PersistenceContext(unitName = "org.cip.esymons-ejbPU", type = PersistenceContextType.EXTENDED)
    private EntityManager em;
    @Resource
    UserTransaction tx;
    @EJB
    CajaChicaFacadeLocal cajaChicaFacadeLocal;
    @EJB
    DetCajaChicaFacadeLocal detCajaChicaFacadeLocal;
    @EJB
    PersonaNaturalFacadeLocal personaNaturalFacadeLocal;
    @EJB
    ColegiadoFacadeLocal colegiadoFacadeLocal;
    @EJB
    SolicitanteFacadeLocal solicitanteFacadeLocal;
    @EJB
    PersonaJuridicaFacadeLocal personaJuridicaFacadeLocal;
    private CajaChica cajaChica;
    private List<DetCajaChica> listaDetalleCajaChica;
    private DetCajaChica detCajaChica;
    private String nombreResponsable;
    private int buscarSolicitantePor;
    private List<ComprobanteEgreso> listaVouchers = null;
    private ComprobanteEgreso comprobanteEgreso;
    private int tipoDetalle=0;

    @PostConstruct
    public void crear() {
        cajaChica = new CajaChica();
        cajaChica.setEstadoCajaChica(EnumEstadoCajaChica.ACTIVA);
        cajaChica.setTipoCajaChica(EnumTipoCajaChica.REGULAR);
        listaDetalleCajaChica = new ArrayList<DetCajaChica>();
        detCajaChica = new DetCajaChica();
    }

    public void agregarDetalle() {
        listaDetalleCajaChica.add(detCajaChica);
    }

    public void quitarDetalle() {
        listaDetalleCajaChica.remove(detCajaChica);
    }

    public void buscarSolicitante(String DNIoCIP) {
        detCajaChica.setSolicitante(null);
        if (buscarSolicitantePor == 0) {
            detCajaChica.setSolicitante(personaNaturalFacadeLocal.buscarXDni(DNIoCIP));
        } else {
            if (buscarSolicitantePor == 1) {
                Colegiado cole = colegiadoFacadeLocal.buscarColegiadoXCip(Utiles.devuelveCipCompleto(DNIoCIP));
                if (cole != null) {
                    detCajaChica.setSolicitante(cole.getPersonaNatural());
                }
            } else {
                detCajaChica.setSolicitante(solicitanteFacadeLocal.buscarPorRuc(DNIoCIP));
            }
        }
        if (detCajaChica.getSolicitante() == null) {
            ControladorAbstracto.warn("No existe persona buscada.Intente con otro valor.");
        }
    }

    public void inicializarCajachica() {
        try {
            cajaChica.setMonto(cajaChicaFacadeLocal.saldosRestantes());
        } catch (Exception e) {
            cajaChica.setMonto(0.0);
        }
    }

    @Remove
    public void grabar() {
        try {
            tx.begin();
            cajaChica.setCacDebe(cajaChica.getCacDebe() + cajaChica.getMonto());
            cajaChica.setCacSaldoAnterior(cajaChica.getMonto());
            cajaChicaFacadeLocal.create(cajaChica);
            if (comprobanteEgreso != null) {
                detCajaChica = new DetCajaChica();
                detCajaChica.setDecFecha(new Date());
                detCajaChica.setcomprobanteEgreso(comprobanteEgreso);
                detCajaChica.setDecDebe(comprobanteEgreso.getHaber());
                detCajaChica.setEstado(EnumEstadoDetCajaChica.ACTIVO);
                detCajaChica.setDecConcepto("Voucher");
                detCajaChica.setSolicitante(comprobanteEgreso.getFkSolCodigo());
                detCajaChica.setCajaChica(cajaChica);
                detCajaChicaFacadeLocal.create(detCajaChica);
            }
            cajaChicaFacadeLocal.cerrarSaldosRestantes();
            tx.commit();
        } catch (Exception ex) {
            try {
                tx.rollback();
            } catch (IllegalStateException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            } catch (SecurityException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            } catch (SystemException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
    }

    @Remove
    public void grabarDetalle() {
        try {
            tx.begin();
            detCajaChica.setDecFecha(new Date());
            if (tipoDetalle == 1) {
                for (ComprobanteEgreso ce : listaVouchers) {
                    if (ce.isSeleccionado()) {
                        detCajaChica.setcomprobanteEgreso(ce);
                        detCajaChica.getCajaChica().setCacDebe(detCajaChica.getCajaChica().getCacDebe() + ce.getHaber());
                        em.merge(detCajaChica.getCajaChica());
                        break;
                    }
                }
            } else {
                em.persist(detCajaChica.getDocumentoComprobante());
            }
            detCajaChicaFacadeLocal.create(detCajaChica);
            tx.commit();
        } catch (Exception ex) {
            try {
                tx.rollback();
            } catch (IllegalStateException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            } catch (SecurityException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            } catch (SystemException ex1) {
                Logger.getLogger(RealizarGeneracionCajachicaBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
    }

    @Remove
    public void cancelar() {
    }

    /**
     * @return the cajaChica
     */
    public CajaChica getCajaChica() {
        return cajaChica;
    }

    /**
     * @param cajaChica the cajaChica to set
     */
    public void setCajaChica(CajaChica cajaChica) {
        this.cajaChica = cajaChica;
    }

    /**
     * @return the listaDetalleCajaChica
     */
    public List<DetCajaChica> getListaDetalleCajaChica() {
        return listaDetalleCajaChica;
    }

    /**
     * @param listaDetalleCajaChica the listaDetalleCajaChica to set
     */
    public void setListaDetalleCajaChica(List<DetCajaChica> listaDetalleCajaChica) {
        this.listaDetalleCajaChica = listaDetalleCajaChica;
    }

    /**
     * @return the detCajaChica
     */
    public DetCajaChica getDetCajaChica() {
        return detCajaChica;
    }

    /**
     * @param detCajaChica the detCajaChica to set
     */
    public void setDetCajaChica(DetCajaChica detCajaChica) {
        this.detCajaChica = detCajaChica;
    }

    /**
     * @return the nombreResponsable
     */
    public String getNombreResponsable() {
        return nombreResponsable;
    }

    /**
     * @param nombreResponsable the nombreResponsable to set
     */
    public void setNombreResponsable(String nombreResponsable) {
        this.nombreResponsable = nombreResponsable;
    }

    public int getBuscarSolicitantePor() {
        return buscarSolicitantePor;
    }

    public void setBuscarSolicitantePor(int buscarSolicitantePor) {
        this.buscarSolicitantePor = buscarSolicitantePor;
    }

    /**
     * @return the listaVouchers
     */
    public List<ComprobanteEgreso> getListaVouchers() {
        return listaVouchers;
    }

    /**
     * @param listaVouchers the listaVouchers to set
     */
    public void setListaVouchers(List<ComprobanteEgreso> listaVouchers) {
        this.listaVouchers = listaVouchers;
    }

    /**
     * @return the comprobanteEgreso
     */
    public ComprobanteEgreso getComprobanteEgreso() {
        return comprobanteEgreso;
    }

    /**
     * @param comprobanteEgreso the comprobanteEgreso to set
     */
    public void setComprobanteEgreso(ComprobanteEgreso comprobanteEgreso) {
        this.comprobanteEgreso = comprobanteEgreso;
    }

    /**
     * @return the tipoDetalle
     */
    public int getTipoDetalle() {
        return tipoDetalle;
    }

    /**
     * @param tipoDetalle the tipoDetalle to set
     */
    public void setTipoDetalle(int tipoDetalle) {
        this.tipoDetalle = tipoDetalle;
    }
}
